package org.colswe.junitlab.logica;
import java.util.Date;
import java.util.Map;

import org.colswe.junitlab.modelo.TipoDia;

/**
 * Interface IControlFestivo con la firma de los métodos a implementar en la clase ControlFestivo
 * @author Miguel Ángel Cubides
 *
 */
public interface IControlFestivo {

	/**
	 * Calcula la cantida de horas laboradas en un intervalo de tiempo
	 * @param desde Fecha inicial
	 * @param hasta Fecha final
	 * @return cantidad de horas en el intervalo de tiempo
	 */
	Integer contarHoras(Date desde, Date hasta);

	/**
	 * Valida si @param desde es menor @param hasta
	 * @param desde Fecha inicial
	 * @param hasta Fecha final
	 * @return Verdadero si @param desde es menor a @param hasta, Falso en caso contrario
	 */
	boolean fechasValidas(Date desde, Date hasta);

	/**
	 * Calcula la cantidad de días de cada tipo
	 * @param desde Fecha inicial
	 * @param hasta Fecha final
	 * @return Mapa con la cantidad de días de cada tipo
	 */
	Map<TipoDia, Integer> obtenerDias(Date desde, Date hasta);

	/**
	 * Calcula la cantidad de horas laboradas en un mapa 
	 * @param info Mapa con cantidad de días de cada tipo
	 * @return cantidad de horas laboradas de acuerdo al mapa recibido
	 */
	Integer contarHoras(Map<TipoDia, Integer> info);
	
	/**
	 * Calcula la cantidad de horas laboradas totales en dos intervalos de tiempo
	 * @param desde1 Fecha inicial intervalo 1
	 * @param hasta1 Fecha final intervalo 1
	 * @param desde2 Fecha inicial intervalo 2
	 * @param hasta2 Fecha final intervalo 2
	 * @return Cantidad de horas laboradas totale en dos intervalos
	 */
	Integer contarHoras(Date desde1, Date hasta1, Date desde2, Date hasta2);
	
	/**
	 * Método obtenerFechaFinal: calcula la fecha final con base en la fecha inicial
	 * y la cantidad de horas laborables.
	 * @param inicial Fecha inicial del intervalo
	 * @param horas Cantidad entera de horas laborales 
	 * @return Fecha final del intervalo
	 */
	Date obtenerFechaFinal(Date inicial, Integer horas);
}

